package criterioBusqueda;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import model.Publicacion.Pregunta;
import model.Usuario.UsuarioRegistrado;
import model.criterio.criterioOrden.CriterioOrden;
import model.criterio.criterioOrden.CriterioOrdenAutor;
import model.criterio.criterioOrden.Orden;
import model.criterio.criteriosYbusqueda.BusquedaDePreguntas;
import model.criterio.criteriosYbusqueda.Criterio;
import model.criterio.criteriosYbusqueda.CriterioDeFavorito;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class TestBusquedaPregunta {
	
	Pregunta p;
	Pregunta p2;
	UsuarioRegistrado u;
	UsuarioRegistrado u2;
	Criterio c;
	BusquedaDePreguntas b;
	List<Pregunta> lista;
	List<Criterio> lista2;
	CriterioOrden co;

	@Before
	public void setUp() throws Exception {
		p=mock(Pregunta.class);
		p2=mock(Pregunta.class);
		u=mock(UsuarioRegistrado.class);
		u2=mock(UsuarioRegistrado.class);
		c=mock(CriterioDeFavorito.class);
		lista=new ArrayList<Pregunta>();
		lista2=new ArrayList<Criterio>();
		lista.add(p);
		lista2.add(c);
		b=new BusquedaDePreguntas(lista, lista2);
		when(c.seCumple(p)).thenReturn(true);
		co=new CriterioOrdenAutor(Orden.DESC);
		
	}

	@Test
	public void testCumpleConCriterios() {
		
		Assert.assertEquals(true, b.cumpleConCriterios(p));
		verify(c,times(1)).seCumple(p);
		when(c.seCumple(p)).thenReturn(false);
		Assert.assertEquals(false, b.cumpleConCriterios(p));
		
	}
	@Test
	public void testBuscarPreguntasConCriterios()
	{
		Assert.assertEquals(lista, b.buscarPreguntasConCriterios());
		verify(c,times(1)).seCumple(p);
		when(c.seCumple(p)).thenReturn(false);
		Assert.assertEquals(new ArrayList<Pregunta>(), b.buscarPreguntasConCriterios());
	}
	@Test
	public void testBuscarPreguntasConCriteriosYorden()
	{
		b.agregarPregunta(p2);
		when(c.seCumple(p2)).thenReturn(true);
		List<Pregunta> l=new ArrayList<Pregunta>();
		l.add(p2);
		l.add(p);
		
		when(u.getNombre()).thenReturn("a");
		when(u2.getNombre()).thenReturn("b");
		when(p.getAutor()).thenReturn(u);
		when(p2.getAutor()).thenReturn(u2);
		Assert.assertEquals(l, b.buscarPreguntasConCriteriosYorden(co));
		
		verify(u,times(1)).getNombre();
		verify(u2,times(1)).getNombre();
		verify(p,times(1)).getAutor();
		verify(p2,times(1)).getAutor();
	}

}
